
package capa_logica;

import javax.websocket.Session;

// Esta clase hereda de la clase Actor y contiene las funciones que utiliza el tanque 
public class Tanque extends Actor
{
    static int RANGO_DISPARO = 80;
    private boolean puedoDisparar;
    private char codigo;
    private int disparos;
    public Session jugador1;
    public Session jugador2;
    
    public Tanque(int x, int y, int ene, int vis, int vel, int lar, int anc, int ori, Escenario esc) 
    {
        super(x, y, ene, vis, vel, lar, anc, ori, esc);
        disparos = 20;
        codigo = '1';
        puedoDisparar = true;
    }
    
    public void ocuparMatriz()
    {
        for(int i = 0; i < ancho / TAM_CELDA; i++)
        {
            for(int j = 0; j < largo / TAM_CELDA; j++)
            {
                e.ocuparCelda((posicionX / TAM_CELDA) + i, (posicionY / TAM_CELDA) + j, codigo);
            }
        }
    }
    
    public void moverTanque(String dir)
    {
        switch (dir) 
        {
                case "der" :
                    rotarTanqueHorario();
                    break;
                case "izq" :
                    rotarTanqueAntiHorario();
                    break;
                case "arriba" :
                    avanzar('1');
                    break;
                case "abajo" :
                    retroceder('1');
                    break;
        }
    }
    
    public void rotarTanqueHorario()
    {
        if(orientacion == 0 || orientacion == 180)
        {
            int i = 0;
            boolean disponible = true;
            while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
            {
                int j = 0;
                while(j < (largo / TAM_CELDA) && disponible)
                {                
                    if(e.proximaCelda(((posicionX - ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                            / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                    }
                    if(e.proximaCelda(((posicionX + ancho + (TAM_CELDA * i)) 
                            / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                    }
                    j++;
                }
                i++;
            }

            if(disponible)
            {
                i = 0;
                while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
                {
                    int j = 0;
                    while(j < (largo / TAM_CELDA) && disponible)
                    {
                        e.ocuparCelda(((posicionX - ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                                / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) / TAM_CELDA), codigo);
                        e.ocuparCelda(((posicionX + ancho + (TAM_CELDA * i)) 
                                / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) / TAM_CELDA), codigo);
                        j++;
                    }
                    i++;
                }
                posicionX = posicionX - ((largo - ancho) / 2);
                orientacion = orientacion + 45;
            }
        }
        
        else if(orientacion == 90 || orientacion == 270)
        {
            int i = 0;
            boolean disponible = true;
            while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
            {
                int j = 0;
                while(j < (largo / TAM_CELDA) && disponible)
                {
                    if(e.proximaCelda(((posicionX + (TAM_CELDA * j)) 
                            / TAM_CELDA), ((posicionY - ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                                    / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                        System.out.println("CELDA OCUPADA: " + e.proximaCelda(((posicionX 
                                + (TAM_CELDA * j)) / TAM_CELDA), ((posicionY - ((largo - ancho) / 2) 
                                        + (TAM_CELDA * i)) / TAM_CELDA)));
                    }
                    if(e.proximaCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA),
                            (((posicionY + ancho) + (TAM_CELDA * i)) / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                        System.out.println("CELDA OCUPADA: " + e.proximaCelda(((posicionX 
                                + (TAM_CELDA * j)) / TAM_CELDA), (((posicionY + ancho) 
                                        + (TAM_CELDA * i)) / TAM_CELDA)));
                    }
                    j++;
                }
                i++;
            }

            if(disponible)
            {
                i = 0;
                while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
                {
                    int j = 0;
                    while(j < (largo / TAM_CELDA) && disponible)
                    {
                        e.ocuparCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA), ((posicionY 
                                - ((largo - ancho) / 2) + (TAM_CELDA * i)) / TAM_CELDA), codigo);
                        e.ocuparCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA),
                                (((posicionY + ancho) + (TAM_CELDA * i)) / TAM_CELDA), codigo);
                        j++;
                    }
                    i++;
                }
                posicionY = posicionY - ((largo - ancho) / 2);
                orientacion = orientacion + 45;
            }
        }
        
        else if(orientacion == 135 || orientacion == 315)
        {
            int i = 0;
            while(i < (((largo - ancho) / 2) / TAM_CELDA))
                {
                    int j = 0;
                    while(j < (largo / TAM_CELDA))
                    {
                        e.liberarCelda(((posicionX + (TAM_CELDA * i)) / TAM_CELDA),
                                ((posicionY + (TAM_CELDA * j)) / TAM_CELDA));
                        e.liberarCelda(((posicionX + ancho + ((largo - ancho) / 2) 
                                + (TAM_CELDA * i)) / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) 
                                        / TAM_CELDA));
                        j++;
                    }
                    i++;
                }
            posicionX = posicionX + ((largo - ancho) / 2);
            if(orientacion == 315)
            {
                orientacion = 0;
            }
            else
            {
                orientacion = orientacion + 45;
            }
        }
        
        else if(orientacion == 45 || orientacion == 225)
        {
            int i = 0;
            while(i < (((largo - ancho) / 2) / TAM_CELDA))
            {
                int j = 0;
                while(j < (largo / TAM_CELDA))
                {
                    e.liberarCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA),
                            ((posicionY + (TAM_CELDA * i)) 
                                    / TAM_CELDA));
                    e.liberarCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA),
                            ((posicionY + ancho + ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                                    / TAM_CELDA));
                    j++;
                }
                i++;
            }
            posicionY = posicionY + ((largo - ancho) / 2);
            orientacion = orientacion + 45;            
        }
    }
    
    public void rotarTanqueAntiHorario()
    {
        if(orientacion == 0 || orientacion == 180)
        {
            int i = 1;
            boolean disponible = true;
            while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
            {
                int j = 0;
                while(j < (largo / TAM_CELDA) && disponible)
                {
                    
                    
                    if(e.proximaCelda(((posicionX - ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                            / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                    }
                    if(e.proximaCelda(((posicionX + ancho + (TAM_CELDA * i)) / TAM_CELDA),
                            ((posicionY + (TAM_CELDA * j)) / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                    }
                    j++;
                }
                i++;
            }

            if(disponible)
            {
                i = 0;
                while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
                {
                    int j = 0;
                    while(j < (largo / TAM_CELDA) && disponible)
                    {
                        e.ocuparCelda(((posicionX - ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                                / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) / TAM_CELDA), codigo);
                        e.ocuparCelda(((posicionX + ancho + (TAM_CELDA * i)) 
                                / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) / TAM_CELDA), codigo);
                        j++;
                    }
                    i++;
                }
                posicionX = posicionX - ((largo - ancho) / 2);
                if(orientacion == 0)
                {
                    orientacion = 315;
                }
                else
                {
                    orientacion = orientacion - 45;
                }
            }
        }
        
        else if(orientacion == 90 || orientacion == 270)
        {
            int i = 0;
            boolean disponible = true;
            while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
            {
                int j = 0;
                while(j < (largo / TAM_CELDA) && disponible)
                {
                    if(e.proximaCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA), 
                            ((posicionY - ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                                    / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                    }
                    if(e.proximaCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA), 
                            (((posicionY + ancho) + (TAM_CELDA * i)) / TAM_CELDA)) != '0')
                    {
                        disponible = false;
                    }
                    j++;
                }
                i++;
            }

            if(disponible)
            {
                i = 0;
                while(i < (((largo - ancho) / 2) / TAM_CELDA) && disponible)
                {
                    int j = 0;
                    while(j < (largo / TAM_CELDA) && disponible)
                    {
                        e.ocuparCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA), 
                                ((posicionY - ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                                        / TAM_CELDA), codigo);
                        e.ocuparCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA), 
                                (((posicionY + ancho) + (TAM_CELDA * i)) / TAM_CELDA), codigo);
                        j++;
                    }
                    i++;
                }
                posicionY = posicionY - ((largo - ancho) / 2);
                orientacion = orientacion - 45;
            }
        }
        
        else if(orientacion == 45 || orientacion == 225)
        {
            int i = 0;
            while(i < (((largo - ancho) / 2) / TAM_CELDA))
                {
                    int j = 0;
                    while(j < (largo / TAM_CELDA))
                    {
                        e.liberarCelda(((posicionX + (TAM_CELDA * i)) / TAM_CELDA),
                                ((posicionY + (TAM_CELDA * j)) / TAM_CELDA));
                        e.liberarCelda(((posicionX + ancho + ((largo - ancho) / 2) 
                                + (TAM_CELDA * i)) / TAM_CELDA), ((posicionY + (TAM_CELDA * j)) 
                                        / TAM_CELDA));
                        j++;
                    }
                    i++;
                }
            posicionX = posicionX + ((largo - ancho) / 2);
            orientacion = orientacion - 45;

        }
        
        else if(orientacion == 135 || orientacion == 315)
        {
            int i = 0;
            while(i < (((largo - ancho) / 2) / TAM_CELDA))
            {
                int j = 0;
                while(j < (largo / TAM_CELDA))
                {
                    e.liberarCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA),
                            ((posicionY + (TAM_CELDA * i)) / TAM_CELDA));
                    e.liberarCelda(((posicionX + (TAM_CELDA * j)) / TAM_CELDA), 
                            ((posicionY + ancho + ((largo - ancho) / 2) + (TAM_CELDA * i)) 
                                    / TAM_CELDA));
                    j++;
                }
                i++;
            }
            posicionY = posicionY + ((largo - ancho) / 2);
            orientacion = orientacion - 45;            
        }
    }
    
    public Proyectil disparar() //Devuelve null si no le quedan disparos
    {
        
        Proyectil p = null;
        if((disparos > 0) && (puedoDisparar))
        {
            int rango = RANGO_DISPARO;
            int posicionCanionX = 0;
            int posicionCanionY = 0;
            if(orientacion == 0)
            {
                posicionCanionX = posicionX + (ancho / 2);
                posicionCanionY = posicionY - 40;
            }
            if(orientacion == 90)
            {
                posicionCanionX = posicionX + largo + 40;
                posicionCanionY = posicionY + (ancho / 2);
            }
            if(orientacion == 180)
            {
                posicionCanionX = posicionX + (ancho / 2);
                posicionCanionY = posicionY + 170;
            }
            if(orientacion == 270)
            {
                posicionCanionX = posicionX - 40;
                posicionCanionY = posicionY + (ancho / 2);
            }
            if(orientacion == 45)
            {
                posicionCanionX = posicionX + largo + 13;
                posicionCanionY = posicionY - 25;
                rango = rango - (rango / 3);
            }
            if(orientacion == 135)
            {
                posicionCanionX = posicionX + largo + 15;
                posicionCanionY = posicionY + largo + 15;
                rango = rango - (rango / 3);
            }
            if(orientacion == 225)
            {
                posicionCanionX = posicionX - 20;
                posicionCanionY = posicionY + largo + 15;
                rango = rango - (rango / 3);
            }
            if(orientacion == 315)
            {
                posicionCanionX = posicionX - 15;
                posicionCanionY = posicionY - 15;
                rango = rango - (rango / 3);
            }
            p = new Proyectil(e, posicionCanionX, posicionCanionY, orientacion, rango, this);
            p.disparoProyectil();
            disparos--;
        }
        return p;
    }
    
    // Getters and Setters
    
    public int getDisparos() 
    {
        return disparos;
    }

    public void setDisparos(int disparos) 
    {
        this.disparos = disparos;
    }

    public boolean isPuedoDisparar() {
        return puedoDisparar;
    }

    public void setPuedoDisparar(boolean puedoDisparar) {
        this.puedoDisparar = puedoDisparar;
    }
    
    
}
